import re

from django.contrib.auth.backends import ModelBackend

from apps.users.models import User

"""
系统的方法是   通过用户名来实现登陆
我们的需求是   通过用户名或者手机号  来实现登陆

系统的函数(方法)不能满足我们需求的时候,我们就重写
"""
"""
封装/抽取的思想
为什么要封装/抽取
    1.为了解耦
    2.为了复用代码
    
封装/抽取的步骤
    1.定义一个方法/函数,把要抽取的代码复制过去
    2.哪里有问题改哪里,没有的参数以变量的形式传递,注意是否有返回值,返回一个参数
    3.验证抽取的方法,验证没有问题,就把源代码删除

什么时候封装/抽取
    1.当几行代码(1,2,n行)实现了一个小功能,就可以抽取
    2.当我们的功能在第二次重复出现的时候就要封装
"""

def get_user_by_username(username):
    try:
        if re.match(r'1[345789]\d{9}', username):
            user = User.objects.get(mobile=username)

        else:
            user = User.objects.get(username=username)
    except User.DoesNotExist:
        user = None
    return user

class UsernameMobileModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 过用户名或者手机号  来实现登陆
        # 用户名有可能是用户名也有可能是手机号
        # 我们通过正则来区分手机号和用户名
        # try:
        #     if re.match(r'1[345789]\d{9}',username):
        #         user=User.objects.get(mobile=username)
        #
        #     else:
        #         user = User.objects.get(username=username)
        # except User.DoesNotExist:
        #     user=None
        user=get_user_by_username(username)
        if user is not None and user.check_password(password):
            return user
